package es.gestorusuarios.correo;

import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/*
 * 
 */
public class GestorMail {

    private final String CORREO = "carlosalejandroeupt@gmail.com";
    private final String PASSWORD = "c4rl0s4l3x";
    private final String SERVIDOR_SMTP = "smtp.gmail.com";
    private final String PUERTO = "587";
    private final String ASUNTO_LINK_RECUPERACION = "Link de recuperación de password ";
    public static final String ASUNTO_PETICION_ACEPTADA = "Aceptación de solicitud ";
    public static final String ASUNTO_PETICION_DENEGADA = "Denegación de solicitud ";
    public static final String ASUNTO_PERMISOS_ASIGNADOS = "Asignación de permisos ";
    public static final String ASUNTO_CUENTA_ELIMINADA = "Eliminación de cuenta ";
    public static final String MENSAJE_PETICION_ACEPTADA = "Su petición de alta ha sido aceptada.";
    public static final String MENSAJE_PETICION_DENEGADA = "Su petición de alta ha sido denegada.";
    public static final String MENSAJE_PERMISOS_ASIGNADOS = "Ahora su cuenta posee permisos de administrador.";
    public static final String MENSAJE_CUENTA_ELIMINADA = "Su cuenta ha sido eliminada del sistema. ";
    private Properties propiedades;

    /*
     * 
     */
    public GestorMail() {

        propiedades = new Properties();
        // Nombre del host de correo, es smtp.gmail.com
        propiedades.setProperty("mail.smtp.host", SERVIDOR_SMTP);

        // TLS si está disponible
        propiedades.setProperty("mail.smtp.starttls.enable", "true");

        // Puerto de gmail para envio de correos
        propiedades.setProperty("mail.smtp.port", PUERTO);

        // Nombre del usuario
        propiedades.setProperty("mail.smtp.user", CORREO);

        // Si requiere o no usuario y password para conectarse.
        propiedades.setProperty("mail.smtp.auth", "true");

        propiedades.put("mail.smtp.ssl.trust", SERVIDOR_SMTP);

    }

    /*
     * 
     */
    private class autentificadorSMTP extends javax.mail.Authenticator {

        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(CORREO, PASSWORD);
        }
    }

    /*
     * 
     */
    public String mandarLink(String mailReceptor, String login)
            throws MessagingException {
        System.getSecurityManager();

        Authenticator auth = new autentificadorSMTP();
        Session session = Session.getInstance(propiedades, auth);

        String link = GeneradorLink.getLink();

        MimeMessage msg = new MimeMessage(session);
        msg.setText("Hola " + login + ":\n"
                + "Este es el link para cambiar tu constraseña:\n"
                + "\thttps://155.210.68.160:8443/Practica2/"
                + "recoveryPass.jsp?url=" + link + "&login=" + login
                + "\n\nUn saludo");
        /*msg.setText("Hola " + login + ":\n"
         + "Este es el link para cambiar tu constraseña:\n"
         + "http://localhost:8084/Practica2/"
         + "recoveryPass.jsp?url=" + link + "&login=" + login
         + "\n\nUn saludo");*/
        msg.setSubject(ASUNTO_LINK_RECUPERACION);
        msg.setFrom(new InternetAddress(CORREO));
        msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
                mailReceptor));
        Transport.send(msg);

        return link;
    }

    /*
     * 
     */
    public boolean mandarCorreo(String _mailReceptor, String _asunto, String _mensaje) {
        try {
            System.getSecurityManager();

            Authenticator auth = new autentificadorSMTP();
            Session session = Session.getInstance(propiedades, auth);
            MimeMessage msg = new MimeMessage(session);

            msg.setText(_mensaje);
            msg.setSubject(_asunto);
            msg.setFrom(new InternetAddress(CORREO));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(_mailReceptor));
            Transport.send(msg);

            return true;
        } catch (MessagingException ex) {
            Logger.getLogger(GestorMail.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    /*
     * 
     */
    public static void main(String[] argv) throws MessagingException {
        GestorMail gestor = new GestorMail();
        //gestor.mandarLink("carlosalejandroeupt@gmail.com", "CA");
        //gestor.mandarLink("karlitosms87@gmail.com", "car");
        gestor.mandarCorreo("karlitosms87@hotmail.es", GestorMail.ASUNTO_PETICION_DENEGADA, GestorMail.MENSAJE_PETICION_DENEGADA);
    }
}